package week7.hotel;

import week7.ww.Wachtwoord;

/** 
 * Kluis klasse
 * Practicumopgave Programmeren I
 * @author W.Looge & R. Oost
 * @version 1.0
 */
public class Kluis {
	
	// ----------Instantievariabelen----------
	
    /**
     * Of de kluis actief is
     * @invariant als !actief dan !open
     */
    private boolean actief = false;
    /**
     * Of de kluis open is
     * @invariant als open dan actief
     */
    private boolean open = false;
    /**
     * De wachtwoordklasse die het wachtwoord bij zal houden
     * @invariant waarde != null
     */
    private Wachtwoord pass;
    
	/** 
	 * Constructor; maakt nieuwe <code>kluis</code> aan die standaard
	 * inactief en gesloten is.
	 * @param wachtwoord <code>String</code> met het wachtwoord
     * @require Wachtwoord.testWoord(wachtwoord)
	 * @ensure !this.isActief() && !this.isOpen()
	 */
	public Kluis(String wachtwoord) {
		pass = new Wachtwoord();
        assert pass.testWoord(wachtwoord) == true;
        pass.setWoord(pass.getBeginwoord(), wachtwoord);
	}
	
	/** 
	 * Constructor; maakt nieuwe <code>kluis</code> aan die standaard
	 * inactief en gesloten is.
	 * @ensure !this.isActief() && !this.isOpen()
	 */
	public Kluis() {
		pass = new Wachtwoord();
	}
	
	// ----------Commando's--------------------
	
	/**
	 * Activeert kluisje als het opgegeven wachtwoord
	 * gelijk is aan het ingestelde wachtwoord
     * @param wachtwoord <code>String</code> met het wachtwoord
	 * @ensure als (wactwoord is correct) dan (this.isActief() && !this.isOpen())
	 */
	public void activeer(String wachtwoord) {
        if (!this.isActief() && pass.testWoord(wachtwoord)) {
            this.actief = true;
        }
	}
	/**
     * Zet het kluisje op inactief, indien het kluisje open is, dan
     * zal deze automatisch worden gesloten.
     * @ensure !this.isActief()
	 */
	public void deactiveer() {
        if (this.isActief()) {
            this.sluit();
            this.actief = false;
        }
	}
	
	/**
     * Opent het kluisje als het kluisje actief is
	 * en het wachtwoord correct.
     * @param wachtwoord String met het wachtwoord
	 * @ensure als (pass.testWoord(wachtwoord) && this.isActief()) dan (this.isOpen())
	 */
	public void open(String wachtwoord) {
        if (this.isActief() && !this.isOpen() && pass.testWoord(wachtwoord)) {
            open = true;
        }
	}
	
	/**
     * Sluit het kluisje zonder het te deactiveren
	
	 * @ensure !this.isOpen()
	 */
	public void sluit() {
        if (this.isActief() && this.isOpen()) {
            open = false;
        }
	}
	
	//---------- Queries -------------
	
	/**
     * Vraagt of het kluisje actief is
     * @return boolean Geeft aan of de kluis actief is
	 */
	public boolean isActief() {
		return actief;
	}
	
	/**
     * Vraagt of het kluisje open is
     * @return boolean Geeft aan of de kluis open is
	 */
	public boolean isOpen() {
		return open;
	}
	
	/**
     * Roept de methode aan welke het Wachtwoord-object terug geeft
     * @return Wachtwoord Het object waarin het wachtwoord ligt opgeslagen.
	 */
	public Wachtwoord getWachtwoord() {
		return pass;
	}
}
	